home *** CD-ROM | disk | FTP | other *** search
/ Aminet 3 / Aminet 3 - July 1994.iso / Aminet / text / tex / texerror.lha / NextTeXError.ged next >
Encoding:
Text File  |  1994-03-16  |  13.1 KB  |  356 lines

  1. /* $VER: NextTeXError.ged V 0.6 © 1994 Fin Schuppenhauer    */
  2. /**
  3.    Liefert ausgehend  von der aktuellen  This macro  returns  the  next error
  4.    Zeile den  nächsten Fehler im Quell-  following  the  current line  in the
  5.    text.  (das funktioniert hier aller-  current (La)TeX  source.  (only  the
  6.    dings  nur zeilenweise,  d.h.,  wenn  first error in a line will be found)
  7.    es  mehrere  Fehler  in einer  Zeile     The cursor is placed on that line
  8.    gibt, wird nur der erste gefunden.)   and the  errormessage  will be shown
  9.      Der Cursor  wird auf  diese Stelle  in a requester.
  10.    positioniert und die (La)TeX-Fehler-     As a special feature,  this macro
  11.    meldung  in  einem  Requester  ange-  also works  with sources,  loaded by
  12.    zeigt.                                another (La)TeX file.
  13.      Als besonderes Feature können auch     In this case,  be sure you called
  14.    Quelltexte  nach  Fehlern untersucht  this macro  from the main file  (and
  15.    werden,  die von einer anderen  TeX-  it will find the logfile).
  16.    Datei nachgeladen wurden.  In diesem     If you recompile your source, you
  17.    Fall muß der erste Aufruf vom Haupt-  must   clear   the   clip   variable
  18.    file  aus geschehen,  damit das Log-  'texfiles'   and   may   close   the
  19.    file gefunden  und  geladen  werden   logfile-window.
  20.    kann.                                 The tinny macro  "ResetTeXError.ged"
  21.      Wird der Quelltext neu  übersetzt,  will do that for you.
  22.    sollte   das   Logfile-Fenster   ge-
  23.    schlossen  werden,  vor  allem  aber
  24.    die  Clip-Variable  'texfiles'  mit-
  25.    tels  CALL  SETCLIP('texfiles')  ge-
  26.    löscht   werden    (Das   Mini-Makro
  27.    "ResetTeXErrors.ged" erledigt dies.
  28.  
  29.    Interner Ablauf:
  30.    Zunächst wird der Dateiname des akt-
  31.    Fensters ermittelt und überprüft, ob
  32.    er auf .tex endet und somit ein pot-
  33.    entieller (La)TeX-Quelltext ist.
  34.      Ist  die Clip-Variable  'texfiles'
  35.    nicht  definiert,   so  lädt  dieses
  36.    Makro das zugehörige Logfile  (falls
  37.    vorhanden),  durchsucht  diese  nach
  38.    dazugeladenen Dateien  (.tex),  ver-
  39.    merkt diese inkl. dem Namen des Log-
  40.    files/-fenster in 'texfiles' und er-
  41.    zeugt für jede  gefundene Datei eine
  42.    weitere Clip-Variable mit der Start-
  43.    und Endzeile im Quelltext.
  44.      Anderfalls wird  nun das  Logfile-
  45.    Fenster geLOCKt,  der Cursor auf die
  46.    Startzeile  entsprechend des aktuel-
  47.    len Quelltextes positioniert und die
  48.    erste Fehlerkennung (l.) gesucht.
  49.    Diese wird nun überprüft, ob sie zum
  50.    aktuellen Quelltext  gehört und wenn
  51.    ja auf die  aktuelle Zeile im Quell-
  52.    text folgt.
  53.  
  54.    Dieses Makro ist PUBLIC DOMAIN.       This macro is PUBLIC DOMAIN.
  55.  
  56.    Für weitere  Anregungen,  Fehlerhin-  For bug reports, suggestions,
  57.    weise und  wie  man besser in  ARexx  greetings or anything else, send
  58.    programmiert  (dies ist einer meiner  a postcard (or similary) to:
  59.    ersten Versuche!)  bin ich jederzeit
  60.    dankbar.                                  Fin Schuppenhauer
  61.    Mein Adresse:                             Brausspark 10
  62.                                              D - 20537 Hamburg
  63.       Fin Schuppenhauer                      (Germany)
  64.       Braußpark 10
  65.       20537 Hamburg
  66.  
  67.    Oder über E-Mail:                     Or use e-mail:
  68.  
  69.             schuppen@rzdspc2.informatik.uni-hamburg.de
  70.  
  71.    Zum Abschluß noch einen besonderen
  72.    Dank an Dietmar Eilert für seinen
  73.    GoldED und an Georg Heßmann für
  74.    sein PasTeX (wann kommt 1.4 ?).
  75.  
  76. **/
  77.  
  78. OPTIONS RESULTS                             /* enable return codes     */
  79.  
  80. if (LEFT(ADDRESS(), 6) ~= "GOLDED") then    /* not started by GoldEd ? */
  81.     address 'GOLDED.1'
  82.  
  83. 'LOCK CURRENT'                              /* lock GUI, gain access   */
  84. OPTIONS FAILAT 6                            /* ignore warnings         */
  85. SIGNAL ON SYNTAX                            /* ensure clean exit       */
  86.  
  87.  
  88. /* ------------------------ INSERT YOUR CODE HERE: ------------------- */
  89.  
  90. 'QUERY CAT'
  91. isGerman = (result = "deutsch")
  92.  
  93. /* RexxSupport.library öffnen: */
  94. if ~show('L', "rexxsupport.library") then do
  95.    if ~addlib('rexxsupport.library',0,-30,0) then do
  96.       if (isGerman) then
  97.          'REQUEST BODY="rexxsupport.library kann nicht geöffnet werden!" BUTTON="So''n Mist"'
  98.       else
  99.          'REQUEST BODY="Unable to open rexxsupport.library!" BUTTON="That''s bad!'
  100.       'UNLOCK'
  101.       EXIT
  102.    end
  103. end
  104.  
  105. 'QUERY DOC VAR DOCNAME'
  106.  
  107. /* Haben wir auch einen (La)TeX-Quelltext im aktuellen Fenster? Dann */
  108. /* muß er ja auf .tex oder .sty enden:                               */
  109. if (right(docname,4) ~= '.tex') & (right(docname,4) ~= '.sty') then do
  110.    if (isGerman) then
  111.       'REQUEST BODY="Dies ist kein (La)TeX-Quelltext." BUTTON=Ok'
  112.    else
  113.       'REQUEST BODY="This is no (La)TeX source." BUTTON=Ok'
  114.    'UNLOCK'
  115.    EXIT
  116. end
  117.  
  118. lp = 0
  119. lp = lastpos('/', docname)
  120. if lp = 0 then
  121.    lp = lastpos(':', docname)
  122. filename = right(docname, length(docname)-lp)
  123.  
  124. /* Aktuelle Zeilennummer holen. Von hier aus wird der nächste Fehler */
  125. /* gesucht.                                                          */
  126. 'QUERY ABSLINE VAR CURRLINE'
  127.  
  128. logname = left(docname,length(docname)-3) || 'log'
  129.  
  130. if ~show('C','texfiles') then do
  131.    /* Das kann nur bedeuten, daß es noch kein Logfile geladen wurde: */
  132.    if exists(logname) then do
  133.       /* Logfile existiert: Ist es auch älter als das .tex/.sty-File?: */
  134.       docinfo = statef(docname)
  135.       loginfo = statef(logname)
  136.       docdays = subword(docinfo,5,1)
  137.       docmins = subword(docinfo,6,1)
  138.       doctick = subword(docinfo,7,1)
  139.       logdays = subword(loginfo,5,1)
  140.       logmins = subword(loginfo,6,1)
  141.       logtick = subword(loginfo,7,1)
  142.       if (doctick > logtick) & (docmins >= logmins) & (docdays >= logdays) then do
  143.          if (isGerman) then
  144.             'REQUEST BODY="Logfile ist älter als aktueller Text!|Bitte erst neu übersetzen." BUTTON=Ok'
  145.          else
  146.             'REQUEST BODY="Logfile is older then current text!|Please, compile first." BUTTON=Ok'
  147.          'UNLOCK'
  148.          EXIT
  149.       end
  150.  
  151.       'UNLOCK'
  152.       /* Jetzt schalten wir um auf das Fenster mit unserem .log-File.   */
  153.       /* Sollte es ein deartiges Fenster nicht geben, sorgt dir Option  */
  154.       /* FORCE dafür, daß das Logfile gleich geladen wird.              */
  155.       /* Läßt es sich eigentlich verhindern, daß das neugeladene Fenster*/
  156.       /* nach vorne geholt und aktiviert wird?                          */
  157.       'WINDOW USE='logname' FORCE QUIET'
  158.       'LOCK NAME='logname' QUIET'
  159.  
  160.       /* Nun durchsuchen wir den Text nach dazugeladenen .tex-Dateien   */
  161.       /* und merken uns deren Namen, sowie den Zeilenbereich, den sie   */
  162.       /* beanspruchen (das hilft uns unten bei der Überprüfung, ob der  */
  163.       /* nächste gefundene Fehler auch zum aktuellen Quelltext gehört): */
  164.       texfile = logname
  165.       /* Das Hauptfile taucht zweimal auf (1. in der Parameterübergabe  */
  166.       /* zum TeX-Aufruf; 2. die Information daß das Hauptfile dazuge-   */
  167.       /* laden wurde. Danach können wir die Suche beginnen):            */
  168.       'FIND STRING='filename' FIRST'
  169.       'FIND STRING=.tex NEXT'
  170.       done = 0
  171.       do until done ~= 0
  172.          'FIND STRING=.tex NEXT QUIET'
  173.          if rc = 0 then do
  174.             'PING 1'
  175.             'PREV'
  176.             'QUERY WORD VAR WORT'
  177.             texfile = texfile' 'wort || '.tex'
  178.             /* Jetzt bestimmen wir den Zeilenbereich, denn diese     */
  179.             /* Datei im Logfile beansprucht:                         */
  180.             'FIND STRING=( PREV'
  181.             'QUERY ABSLINE VAR STARTLINE'
  182.             'PING 0'
  183.             ddone = 0
  184.             do until ddone ~= 0
  185.                'BRACKET MATCH'
  186.                if rc = 0 then
  187.                   ddone = 1
  188.                else do
  189.                   /* Keine passende schließende Klammer gefunden.    */
  190.                   /* Dies kann passieren, wenn der Übersetzungsvor-  */
  191.                   /* gang vorzeitig mit x unterbrochen wurde.        */
  192.                   'GOTO BOTTOM'
  193.                   'GOTO EOL STEP 1'
  194.                   'TEXT T=)'
  195.                   'PONG 0'
  196.                end
  197.             end
  198.             'QUERY ABSLINE VAR ENDLINE'
  199.             /* Die geholten Daten sichern: */
  200.             clipvalue = startline' 'endline
  201.             call setclip(wort'.tex', clipvalue)
  202.             /* Zurück zu der Stelle, wo wir .tex gefunden haben: */
  203.             'PONG 1'
  204.          end
  205.          else
  206.             /* Keine weitere .tex-Datei gefunden. */
  207.             done = 1
  208.       end
  209.       call setclip('texfiles', texfile)
  210.  
  211.       /* Alle dazugeladenen .tex-Files gefunden und gesichert.    */
  212.       /* Jetzt positionieren wir uns auf den Beginn des aktuellen */
  213.       /* Textes im Logfile und können dann unten mit der Fehler-  */
  214.       /* suche beginnen.                                          */
  215.       startline = subword(getclip(filename), 1)
  216.       endline = subword(getclip(filename), 2)
  217.       'GOTO LINE='startline
  218.    end
  219.    else do
  220.       if (isGerman) then
  221.          'REQUEST BODY="Logfile nicht gefunden!" BUTTON=Ok'
  222.       else
  223.          'REQUEST BODY="Logfile not found!" BUTTON = Ok'
  224.       'UNLOCK'
  225.       EXIT
  226.    end
  227. end
  228. /* Es gibt im Clip einen Eintrag texfiles, d.h. das Logfile wurde */
  229. /* bereits geladen.                                               */
  230. else do
  231.    /* Ist unsere akt. Datei auch darin enthalten, d.h. gibt es    */
  232.    /* im Clip einen Eintrag, der unserem Filenamen entspricht?    */
  233.    texfiles = getclip('texfiles')
  234.    clipvalue = getclip(filename)
  235.    if rc ~= 0 then do
  236.       if (isGerman) then
  237.          'REQUEST BODY="Kein Hinweis auf diese Datei|im geladenen Logfile!" BUTTON=Ok'
  238.       else
  239.          'REQUEST BODY="No information for this file|in loaded logfile!" BUTTON="I see"'
  240.       'UNLOCK'
  241.       EXIT
  242.    end
  243.    startline = subword(clipvalue, 1, 1)
  244.    endline = subword(clipvalue, 2, 1)
  245.    logwindow = subword(texfiles, 1, 1)
  246.    'UNLOCK'
  247.    /* FORCE, falls das Fenster zwischenzeitlich geschlossen wurde: */
  248.    'WINDOW USE='logwindow' FORCE QUIET'
  249.    'LOCK NAME='logwindow' QUIET'
  250. end
  251.  
  252. /* Hier beginnt nun endlich die Fehlersuche: */
  253. 'GOTO LINE='startline
  254. done = 0
  255. do until done ~= 0
  256.    'FIND STRING=l. NEXT QUIET'
  257.    if rc = 0 then do
  258.       /* Fehlerkennung gefunden: */
  259.       'QUERY COLUMN VAR CURRCOL'
  260.       if currcol <= 2 then do
  261.          /* Die Fehlerkennung steht immer zu Beginn der Zeile, wie hier. */
  262.          'QUERY ABSLINE VAR ERROCCLINE'
  263.          if erroccline > endline then do
  264.             /* Diese Fehlermeldung gehört nicht zum aktuellen  */
  265.             /* Quelltext.                                      */
  266.             line = 0
  267.             done = 1
  268.          end
  269.          else do
  270.             /* Gut, die Fehlermeldung liegt im gültigen Bereich.  */
  271.             /* Aber innerhalb dieses Bereiches könnte eine weitere*/
  272.             /* tex-Datei dazu geladen worden sein. Wenn die hier  */
  273.             /* gefundene Fehlermeldung in so einem Bereich liegen */
  274.             /* sollte, gehört sie nicht zu unserem aktuellen Text */
  275.             /* und die Suche muß fortgesetzt werden:              */
  276.             si = 1
  277.             aw = words(texfiles)
  278.             do until (word(texfiles, si) = filename) | (si > aw)
  279.                si = si + 1
  280.             end
  281.             ddone = 0
  282.             do j = si+1 to aw while ddone = 0
  283.                file = subword(texfiles, j, 1)
  284.                                        /*if file ~= filename then do*/
  285.                sline = subword(getclip(file), 1, 1)
  286.                eline = subword(getclip(file), 2, 1)
  287.                if (sline <= erroccline) & (eline >= erroccline) then
  288.                   ddone = 1
  289.             end
  290.             if ddone = 0 then do
  291.                /* Das sieht gut aus. Zeilennummer holen (l.xxx): */
  292.                'GOTO STEP=2'
  293.                'QUERY WORD VAR ERRORLINE'
  294.                if errorline > currline then do
  295.                   line = errorline
  296.                   done = 1
  297.                end
  298.             end
  299.          end
  300.       end
  301.    end
  302.    else do
  303.       /* Keine weitere Fehlerkennung gefunden: */
  304.       line = 0
  305.       done = 1
  306.    end
  307. end
  308.  
  309. if line ~= 0 then do
  310.    /* Ja, es gab noch einen weiteren Fehler. Jetzt besorgen wir   */
  311.    /* uns noch die zugehörige Fehlermeldung:                      */
  312.    /* (Wir erkennen sie an einem ! in der ersten Spalte.)         */
  313.    done = 0
  314.    do until done ~= 0
  315.       'FIND STRING=! PREV'
  316.       'QUERY COLUMN VAR CURRCOL'
  317.       if currcol = 1 then
  318.          done = 1
  319.    end
  320.    'QUERY BUFFER VAR CURRBUF'
  321.    currbuf = delword(currbuf, 1 , 1)
  322.    'UNLOCK'
  323.  
  324.    /* Gut, jetzt haben wir alle notwendigen Informationen aus  */
  325.    /* dem Logfile extrahiert und können nun zurück auf unseren */
  326.    /* Quelltext schalten, den Cursor auf die fehlerhafte Zeile  */
  327.    /* positionieren und die Fehlermeldung ausgeben:            */
  328.    'LOCK NAME='docname
  329.    'GOTO LINE='line
  330.    if (isGerman) then
  331.       'REQUEST BODY="Fehler in Zeile 'line':|'currbuf'" BUTTON=Ok'
  332.    else
  333.       'REQUEST BODY="Error in line 'line':|'currbuf'" BUTTON=Ok.'
  334. end
  335. else do
  336.    'UNLOCK'
  337.    'LOCK NAME='docname
  338.    if (isGerman) then
  339.       'REQUEST BODY="Kein weiterer Fehler." BUTTON=Ok'
  340.    else
  341.       'REQUEST BODY="No more errors." BUTTON=Ok'
  342. end
  343.  
  344.  
  345. /* ---------------------------- END OF YOUR CODE --------------------- */
  346.  
  347. 'UNLOCK' /* VERY important: unlock GUI */
  348. EXIT
  349.  
  350. SYNTAX:
  351.  
  352. SAY "Sorry, error line" SIGL ":" ERRORTEXT(RC) ":-("
  353. 'UNLOCK'
  354. EXIT
  355.  
  356.